//package com.kitbox.hl.meshow.common.utils.page;
//
//import com.anpotech.tms.framework.core.utils.CommonUtil;
//import com.anpotech.tms.framework.core.web.mapper.IBaseMapper;
//import com.anpotech.tms.framework.core.web.result.PubResultMap;
//import org.apache.commons.beanutils.PropertyUtils;
//import org.apache.ibatis.mapping.BoundSql;
//import org.apache.ibatis.mapping.ParameterMapping;
//import org.apache.ibatis.mapping.ParameterMode;
//import org.apache.ibatis.session.Configuration;
//import org.apache.ibatis.session.SqlSession;
//import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory;
//import org.apache.ibatis.type.JdbcType;
//import org.apache.ibatis.type.TypeHandler;
//import org.springframework.beans.factory.annotation.Autowired;
//
//import javax.sql.DataSource;
//import java.sql.*;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//
///**
// * service 基类，此处放service公共方法， 所有spring service必须继承该类
// *
// * @author YuQiang
// * @version [1.0, 2018年4月5日]
// * @see {@link XXX}
// * @since [utlz/2.0]
// */
//public abstract class AbsBaseService <T extends IBaseMapper> extends BaseService {
//
//	@Autowired
//	protected T mapper;
//
//	@Autowired
//	private DataSource ds;
//
//	@Autowired
//	private DefaultSqlSessionFactory sessionFactory;
//
//	public String getMyBatisSql(String sqlId, PageHelper ph) {
//		BoundSql boundSql = sessionFactory.getConfiguration().getMappedStatement(sqlId).getBoundSql(ph);
//		String sql = boundSql.getSql().replace("\n", " ").replace("\t", " ");
//		while (sql.contains("  ")) {
//			sql = sql.replace("  ", " ");
//		}
//		return sql;
//	}
//
//	public List<PubResultMap> getListAllBySql(String sql)
//	{
//		return mapper.getListAllBySql(sql);
//	}
//
//	public DataGrid getPagedListBySql(String inputSql, PageHelper ph, Object ... params) throws Exception {
//		long start = System.currentTimeMillis();
//		SqlSession session = null;
//		Connection connection = null;
//		PreparedStatement ps = null;
//		PreparedStatement psTotal = null;
//		try {
//			Configuration configuration = sessionFactory.getConfiguration();
//			String sql = inputSql;
//			if (!sql.toUpperCase().contains(" WHERE "))
//			{
//				sql = sql + " where 1 = 1 ";
//			}
//			sql = sql + ph.getSqlCondition();
//			String sqlTotal = getTotalSql(sql);
//			sql = sql + " " + (CommonUtil.isTrimEmpty(ph.getOrderBy()) ? "" : ph.getOrderBy()) + " limit " + ph.getStart() + "," + ph.getRows();
//			session = sessionFactory.openSession();
//			connection = session.getConnection();
//			ps = connection.prepareStatement(sql);
//			psTotal = connection.prepareStatement(sqlTotal);
//			List paramsList = new ArrayList();
//			for (Object param : params)
//			{
//				paramsList.add(param);
//			}
//			paramsList.addAll(ph.getParams());
//			// 获取所有参数
//			for (int i = 0; i < paramsList.size(); i++) {
//				Object param = paramsList.get(i);
//				if (param instanceof String) {
//					ps.setString(i + 1, String.valueOf(param));
//					psTotal.setString(i + 1, String.valueOf(param));
//				} else if (param instanceof Integer) {
//					ps.setInt(i + 1, Integer.valueOf(String.valueOf(param)).intValue());
//					psTotal.setInt(i + 1, Integer.valueOf(String.valueOf(param)).intValue());
//				}else if (param instanceof Long) {
//					ps.setLong(i + 1, Long.valueOf(String.valueOf(param)).longValue());
//					psTotal.setLong(i + 1, Long.valueOf(String.valueOf(param)).longValue());
//				}else if (param instanceof Double) {
//					ps.setDouble(i + 1, Double.valueOf(String.valueOf(param)).doubleValue());
//					psTotal.setDouble(i + 1, Double.valueOf(String.valueOf(param)).doubleValue());
//				}else if (param instanceof Date) {
//					ps.setDate(i + 1, (Date)param);
//					psTotal.setDate(i + 1, (Date)param);
//				}
//			}
//			List rows = wrapperList(ps.executeQuery());
//			int total = getListTotal(psTotal.executeQuery());
//			DataGrid dataGrid = new DataGrid();
//			dataGrid.setRows(rows);
//			dataGrid.setTotal(total);
//			dataGrid.setTotalPage(total / ph.getRows() + (total % ph.getRows() > 0 ? 1 : 0));
//			dataGrid.setPage(ph.getPage());
//			return dataGrid;
//		} catch (Exception e) {
//			throw e;
//		} finally {
//			if (ps != null)
//			{
//				ps.close();
//			}
//			if (psTotal != null)
//			{
//			psTotal.close();
//			}
//			if (connection != null)
//			{
//			connection.close();
//			}
//			if (session != null)
//			{
//			session.close();
//			}
//			long end = System.currentTimeMillis();
//			if (end - start > 100)
//			{
//				logger.warn("low efficiency sql, time use = " + (end - start) + "ms , sql = inputSql");
//			}
//		}
//	}
//
//	public DataGrid getPagedListByMybatisId(String sqlId, PageHelper ph) throws Exception {
//		long start = System.currentTimeMillis();
//		SqlSession session = null;
//		Connection connection = null;
//		PreparedStatement ps = null;
//		PreparedStatement psTotal = null;
//		try {
//			Configuration configuration = sessionFactory.getConfiguration();
//			BoundSql boundSql = sessionFactory.getConfiguration().getMappedStatement(sqlId).getBoundSql(ph);
//			String sql = boundSql.getSql().replace("\n", " ").replace("\t", " ");
//			while (sql.contains("  ")) {
//				sql = sql.replace("  ", " ");
//			}
//			if (!sql.toUpperCase().contains(" WHERE "))
//			{
//				sql = sql + " where 1 = 1 ";
//			}
//			sql = sql + ph.getSqlCondition();
//			String sqlTotal = getTotalSql(sql);
//			sql = sql + " " + (CommonUtil.isTrimEmpty(ph.getOrderBy()) ? "" : ph.getOrderBy()) + " limit " + ph.getStart() + "," + ph.getRows();
//			session = sessionFactory.openSession();
//			connection = session.getConnection();
//			ps = connection.prepareStatement(sql);
//			psTotal = connection.prepareStatement(sqlTotal);
//
//			// 获取所有参数
//			List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
//			int mybatisParamsSize = 0;
//			if (parameterMappings != null) {
//				mybatisParamsSize = parameterMappings.size();
//				for (int i = 0; i < parameterMappings.size(); i++) {
//					// 获取某个参数
//					ParameterMapping parameterMapping = parameterMappings.get(i);
//					if (parameterMapping.getMode() != ParameterMode.OUT) {
//						// 参数的名字，属性
//						String propertyName = parameterMapping.getProperty();
//						Object value = PropertyUtils.getProperty(ph, propertyName);
//
//						// 参数列的TypeHandler
//						TypeHandler typeHandler = parameterMapping.getTypeHandler();
//						// jdbcType的处理
//						JdbcType jdbcType = parameterMapping.getJdbcType();
//						if (value == null && jdbcType == null) {
//							jdbcType = configuration.getJdbcTypeForNull();
//						}
//						// 见下面的分析，这里实现了 JDBC的 pst.setString(1,"Tom" + i);
//						typeHandler.setParameter(ps, i + 1, value, jdbcType);
//						typeHandler.setParameter(psTotal, i + 1, value, jdbcType);
//					}
//				}
//			}
//			for (int i = 0; i < ph.getParams().size(); i++) {
//				Object param = ph.getParams().get(i);
//				if (param instanceof String) {
//					ps.setString(i + 1 + mybatisParamsSize, String.valueOf(param));
//					psTotal.setString(i + 1 + mybatisParamsSize, String.valueOf(param));
//				} else if (param instanceof Integer) {
//					ps.setInt(i + 1 + mybatisParamsSize, Integer.valueOf(String.valueOf(param)).intValue());
//					psTotal.setInt(i + 1 + mybatisParamsSize, Integer.valueOf(String.valueOf(param)).intValue());
//				}else if (param instanceof Long) {
//					ps.setLong(i + 1 + mybatisParamsSize, Long.valueOf(String.valueOf(param)).longValue());
//					psTotal.setLong(i + 1 + mybatisParamsSize, Long.valueOf(String.valueOf(param)).longValue());
//				}else if (param instanceof Double) {
//					ps.setDouble(i + 1 + mybatisParamsSize, Double.valueOf(String.valueOf(param)).doubleValue());
//					psTotal.setDouble(i + 1 + mybatisParamsSize, Double.valueOf(String.valueOf(param)).doubleValue());
//				}else if (param instanceof Date) {
//					ps.setDate(i + 1 + mybatisParamsSize, (Date)param);
//					psTotal.setDate(i + 1 + mybatisParamsSize, (Date)param);
//				}
//			}
//			List rows = wrapperList(ps.executeQuery());
//			int total = getListTotal(psTotal.executeQuery());
//			DataGrid dataGrid = new DataGrid();
//			dataGrid.setRows(rows);
//			dataGrid.setTotal(total);
//			dataGrid.setTotalPage(total / ph.getRows() + (total % ph.getRows() > 0 ? 1 : 0));
//			dataGrid.setPage(ph.getPage());
//			return dataGrid;
//		} catch (Exception e) {
//			throw e;
//		} finally {
//			if (ps != null)
//			{
//				ps.close();
//			}
//			if (psTotal != null)
//			{
//			psTotal.close();
//			}
//			if (connection != null)
//			{
//			connection.close();
//			}
//			if (session != null)
//			{
//			session.close();
//			}
//			long end = System.currentTimeMillis();
//			if (end - start > 100)
//			{
//				logger.warn("low efficiency sql, time use = " + (end - start) + "ms , sql = inputSql");
//			}
//		}
//	}
//
//	private String getTotalSql(String sql) {
//		return "select count(*) " + sql.substring(sql.toUpperCase().indexOf(" FROM "));
//	}
//
//	private int getListTotal(ResultSet rs) throws Exception {
//		if (rs.next()) {
//			return rs.getInt(1);
//		}
//		return 0;
//	}
//
//	private List wrapperList(ResultSet rs) throws Exception {
//		List result = new ArrayList();
//		ResultSetMetaData md = rs.getMetaData(); // 获得结果集结构信息,元数据
//		int columnCount = md.getColumnCount(); // 获得列数
//		int total = 0;
//		while (rs.next()) {
//			Map<String, Object> rowData = new PubResultMap<String, Object>();
//			for (int i = 1; i <= columnCount; i++) {
//				rowData.put(md.getColumnName(i), rs.getObject(i));
//			}
//			result.add(rowData);
//		}
//		return result;
	//}
//}
